[주식 자동화] 퀀트투자의 시작

Posted by Hyungbin on 2026-04-21

0. 왜 이 프로젝트가 시작되었는지? (기획 배경)

투자를 하다 보면 가장 큰 적은 결국 '내 마음'입니다. 시장이 떨어지면 무서워서 팔고 싶고, 오르면 욕심이 나서 더 사고 싶어지죠. 저는 회계 담당자로서 숫자는 거짓말을 하지 않는다는 것을 압니다. 그래서 **"내 감정을 100% 배제하고, 철저히 데이터(거시경제 지표, 주가 추세)에만 기반해 기계처럼 매매해 주는 비서가 있다면 어떨까?"**라는 생각에서 출발했습니다. 잠든 새벽에도 알아서 미국 주식을 분석하고 사고팔며, 아침에는 장부까지 깔끔하게 정리해 주는 나만의 '디지털 CFO(최고재무책임자)'를 만드는 것이 이 프로젝트의 목표였습니다.

1. 어떻게 구현하고자 했는지? (설계도)

봇을 만들기 위해 세 가지 핵심 부품을 조립했습니다.

  • 🧠 두뇌 (Yahoo Finance + Python): 야후 파이낸스에서 나스닥(QQQ), 하이일드 채권(HYG), 미국 연준 데이터(FRED)를 실시간으로 가져와 지금이 '공격할 때(TQQQ)'인지 '방어할 때(QQQ)'인지 판단합니다.
  • 💪 팔과 다리 (한국투자증권 API): 두뇌가 결정을 내리면 증권사 서버에 직접 접속해, 내 계좌의 돈을 확인하고 주식을 사고파는 실제 행동을 합니다.
  • 🗣️ 입과 귀 (Telegram): 매일 아침 수익률 보고서를 내 폰으로 보내주고, 내가 카톡처럼 명령어를 치면 즉각 대답해 주는 소통 창구입니다.
  • 2. 어떤 문제점이 있어왔는지? (The Quant's Dilemma)

    단순히 "서버를 어떻게 켤 것인가" 같은 기술적인 문제는 부차적이었습니다. 진짜 고통스러운 고민은 **"과연 TQQQ/QQQ 스위칭 전략이 현실에서 통하는가?"**를 백테스트하며 마주한 전략적 한계들이었습니다.

    3. 어떻게 극복하였는지? (The Strategy Breakthrough)

    수십 번의 백테스트 로직 수정과 치열한 논의 끝에, 우리는 시장의 노이즈를 걸러낼 **4중 필터(게임의 룰)**를 확정하며 문제를 극복했습니다.

    4. 그래서 최종 코드가 무엇인지?

    (상단에 매니저님이 적어두신 Python 코드 전체가 바로 이 섹션에 들어갑니다. 총 300줄이 넘는 피와 땀의 결정체입니다!)

    import telebot

    import yfinance as yf

    import pandas as pd

    import numpy as np

    import json

    import time

    import threading

    import os

    import requests

    from dotenv import load_dotenv

    import pandas_datareader.data as web

    from datetime import datetime, timedelta

    load_dotenv()

    KIS_APPKEY = os.getenv('KIS_APPKEY')

    KIS_SECRET = os.getenv('KIS_SECRET')

    KIS_CANO = os.getenv('KIS_CANO')

    KIS_ACNT_PRDT_CD = os.getenv('KIS_ACNT_PRDT_CD')

    KIS_URL = os.getenv('KIS_URL')

    BOT_TOKEN = ‘token_code'

    CHAT_ID = 'chat_code'

    bot = telebot.TeleBot(BOT_TOKEN)

    LEDGER_FILE = 'ledger_config.json'

    HISTORY_FILE = 'trade_history.csv'

    EST_FEE_RATE = 0.0025

    HYG_THRESHOLD = -1.0

    HYG_DAYS = 3

    FRED_THRESHOLD = 5.5

    SWITCH_CONFIRM_DAYS = 3

    def get_access_token():

    def get_current_price_kis(ticker, token):

    def get_kis_krw_balance(token):

    def get_kis_balance(token):

    def execute_order_kis(ticker, qty, price, token, side="buy"):

    def auto_trade_logic(target_ticker, st):

    def load_ledger():

    def save_ledger(data):

    def log_trade(acc_type, trade_type, ticker, qty, price, amount, fee, date_str=None):

    def get_historical_price(ticker, target_date):

    def get_strategy_state():

    def get_account_summary():

    def generate_strategy_report():

    @bot.message_handler(commands=['start', 'help'])

    def send_welcome(message): bot.reply_to(message, "🤖 CFO v10.4 실전모드 (원화 예수금 완벽연동)\n/status /strategy /now", parse_mode='HTML')

    @bot.message_handler(commands=['now'])

    def handle_now(message):

    @bot.message_handler(commands=['status'])

    def handle_status(message):

    @bot.message_handler(commands=['strategy'])

    def handle_strategy(message):

    Finance Analyst : Hyungbin
    Input & Output : 매일의 기록, 확실한 ROI